﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Biblio.Domain
{
    [Table("Material")]
    public class Material
    {

        public Material()
        {
            
        }

        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        [Required]
        public String Titulo { get; set; }
        [Required]
        public string TipoMaterial { get; set; }
        [Required]
        public int Codigo { get; set; }
        [Required]
        public string Sinopsis { get; set; }
        public virtual IList<Autor> Autores { get; set; }
        [Required]
        public string Editorial { get; set; }
        public IList<string> Generos { get; set; }

        public int CantidadEjemplaresDisponibles { get; set; }
        public IList<Ejemplar> Ejemplares { get; set; }
        public IList<Reserva> ReservasActivas { get; set; }
        public IList<Reserva> ReservasEnEspera { get; set; }

        public Reserva Reservar(Socio soc)
        {
            Reserva r = null;

            if ((ReservasActivas.Where(s => s.Socio.Equals(soc)).FirstOrDefault() == null &&
                ReservasEnEspera.Where(s => s.Socio.Equals(soc)).FirstOrDefault() == null))
            {
                if (CantidadEjemplaresDisponibles > 0)
                {
                    r = new Reserva(soc, this, 3);
                    CantidadEjemplaresDisponibles--;

                    ReservasActivas.Add(r);
                }
                else
                {
                    r = new Reserva(soc, this, 100);
                    ReservasEnEspera.Add(r);
                }
            }
            soc.Reservas.Add(r);
            return r;
        }

        public Ejemplar Despachar(Socio soc)
        {
            Reserva r = ReservasActivas.Where(s => s.Socio.Equals(soc)).FirstOrDefault();
            Ejemplar ej = null; ;
            if (r != null)
            { 
                ReservasActivas.Remove(r);
                ej = Ejemplares.Where(e => e.Estado.Equals(true)).FirstOrDefault();
                ej.Estado = false;
            }
            return ej;
        }

        public void Devolver(Prestamo p,Socio soc) 
        {
            Reserva r;
            if (ReservasEnEspera.Count() != 0)
            {
                r = ReservasEnEspera.First();
                // al r.Socio le mando un mail para avisarle que su reserva esta activa.
                ReservasEnEspera.RemoveAt(0);
                ReservasActivas.Add(r);
            }
            else 
            {
                CantidadEjemplaresDisponibles++;
            }
            p.Ejemplar.Estado = true;

        }
    }
}
